package com.qf.test;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;

/**
 * @author 汤奇
 * @version V1.0
 * @Project BookPro
 * @Package com.qf.test
 * @Description: 测试shiro权限框架基本使用
 * @Date 2022/6/13 10:41
 */
public class ShiroDemo {
    public static void main(String[] args) {
        //1.获取SecurityManager核心骨架
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        //2.获取配置文件中的权限数据,用户数据,角色数据
        IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
        //3.将用户,角色,权限数据放入SecurityManager核心对象中
        securityManager.setRealm(iniRealm);
        //4.设置SecurityManagerUtils核心对象工具类
        SecurityUtils.setSecurityManager(securityManager);
        //5.得到Subject当前登录用户对象
        Subject subject = SecurityUtils.getSubject();
        //6.登录,封装AuthenticationToken对象,模拟用户在页面输入的用户名密码
        AuthenticationToken token = new UsernamePasswordToken("zhangsan", "123456");
        //7.调用login登录方法,让shiro框架核心SecurityManager对象去验证用户输入的用户名密码
        //和配置文件或者数据库中记录的用户名,密码是否一致,进行权限校验
        try {
            subject.login(token);
            System.out.println("=====用户登录成功!=====");
            //8.如果用户名,密码不对,抛出对应的异常
        } catch (UnknownAccountException e){
            System.out.println("=====用户名不对!=====");
        } catch (IncorrectCredentialsException e){
            System.out.println("=====密码不对!=====");
        } catch (AuthenticationException e) {
            System.out.println("=====其他未知异常!=====");
        }

        //9.如果用户名密码正确,获取,用户,角色,权限等框架中能够获取到的用户信息打印,登录成功
        System.out.println("==============登录后判断用户角色=================");
        System.out.println("========判断用户是否为管理员角色======="+subject.hasRole("admin"));
        System.out.println("========判断用户是否为开发者角色======="+subject.hasRole("developer"));
        System.out.println("========判断用户是否为xxx角色======="+subject.hasRole("xxx"));

        System.out.println("==============登录后判断用户权限=====父模块:子模块:操作=================");
        System.out.println("========判断当前用户是否有用户添加权限操作======="+subject.isPermitted("sys:user:add"));
        System.out.println("========判断当前用户是否有用户删除权限操作======="+subject.isPermitted("sys:user:del"));
        System.out.println("========判断当前用户是否有菜单添加权限操作======="+subject.isPermitted("sys:menu:add"));
        System.out.println("========判断当前用户是否有菜单删除权限操作======="+subject.isPermitted("sys:menu:del"));
    }
}
